
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    /**
     * 第一遍
     * @param nums1
     * @param m
     * @param nums2
     * @param n
     */
//    public void merge(int[] nums1, int m, int[] nums2, int n) {
//        // 初始化两个指针在两个数组尾部
//        int i = m - 1, j = n - 1;
//        int p = nums1.length - 1;
//        while (i >= 0 && j >= 0) {
//            if (nums1[i] < nums2[j]) {
//                nums1[p] = nums2[j];
//                j--;
//            } else {
//                nums1[p] = nums1[i];
//                i--;
//            }
//            p--;
//        }
//        while (j >= 0) {
//            nums1[p] = nums2[j];
//            j--;
//            p--;
//        }
//    }


    /**
     * 第二遍
     * @param nums1
     * @param m
     * @param nums2
     * @param n
     */
//    public void merge(int[] nums1, int m, int[] nums2, int n) {
//        // 定义两个指针分别在两个数组尾部
//        int i = m - 1, j = n - 1;
//        // 定义指针p指向nums数组末尾
//        int p = nums1.length - 1;
//        while (i >= 0 && j >= 0) {
//            if (nums1[i] < nums2[j]) {
//                nums1[p] = nums2[j];
//                j--;
//            } else {
//                nums1[p] = nums1[i];
//                i--;
//            }
//            p--;
//        }
//        while (j >= 0) {
//            nums1[p] = nums2[j];
//            j--;
//            p--;
//        }
//    }

    /**
     * 第三遍
     * @param nums1
     * @param m
     * @param nums2
     * @param n
     */
//    public void merge(int[] nums1, int m, int[] nums2, int n) {
//        // 定义两个指针分别在两个数组尾部
//        int i = m - 1, j = n - 1;
//        int p = nums1.length - 1;
//        while (i >= 0 && j >= 0) {
//            if (nums1[i] < nums2[j]) {
//                nums1[p] = nums2[j];
//                j--;
//            } else {
//                nums1[p] = nums1[i];
//                i--;
//            }
//            p--;
//        }
//        while (j >= 0) {
//            nums1[p] = nums2[j];
//            j--;
//            p--;
//        }
//    }


    /**
     * 第四遍 2/27
     * @param nums1
     * @param m
     * @param nums2
     * @param n
     */
//    public void merge(int[] nums1, int m, int[] nums2, int n) {
//        int i = m - 1;
//        int j = n - 1;
//        int p = nums1.length - 1;
//
//        while (i >= 0 && j >= 0) {
//            if (nums1[i] < nums2[j]) {
//                nums1[p] = nums2[j];
//                j--;
//            } else {
//                nums1[p] = nums1[i];
//                i--;
//            }
//            p--;
//        }
//
//        while (j >= 0) {
//            nums1[p] = nums2[j];
//            j--;
//            p--;
//        }
//    }

    /**
     * 第五遍 2/27
     * @param nums1
     * @param m
     * @param nums2
     * @param n
     */
//    public void merge(int[] nums1, int m, int[] nums2, int n) {
//        int i = m - 1, j = n - 1;
//        int p = nums1.length - 1;
//
//        while (i >= 0 && j >= 0) {
//            if (nums1[i] < nums2[j]) {
//                nums1[p] = nums2[j];
//                j--;
//            } else {
//                nums1[p] = nums1[i];
//                i--;
//            }
//            p--;
//        }
//
//        while (j >= 0) {
//            nums1[p] = nums2[j];
//            j--;
//            p--;
//        }
//    }


    /**
     * 第六遍 3/1
     * 双指针
     * @param nums1
     * @param m
     * @param nums2
     * @param n
     */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i = m - 1, j = n - 1;
        int p = nums1.length - 1;
        while (i >= 0 && j >= 0) {
            if (nums1[i] < nums2[j]) {
                 nums1[p] = nums2[j];
                 j--;
            } else {
                nums1[p] = nums1[i];
                i--;
            }
            p--;
        }

        while (j >= 0) {
            nums1[p] = nums2[j];
            j--;
            p--;
        }
    }
}
//leetcode submit region end(Prohibit modification and deletion)
